package tec;

class TestAutobus {
    
 
    void testPlacesAssises(){
	
	Bus bus_assis  = new Autobus(7,0);
	Bus bus_debout = new Autobus(0,7);
	
	assert bus_assis.aPlaceAssise()  == true : "TestPlacesAssises fail";
	assert bus_debout.aPlaceAssise() == false: "TestPlacesAssises fail"; 

    } 

    void testPlacesDebout(){
	Bus bus_assis  = new Autobus(7,0);
	Bus bus_debout = new Autobus(0,7);
	
	assert bus_assis.aPlaceDebout()  == false : "TestPlacesDebout fail";
	assert bus_debout.aPlaceDebout() == true:   "TestPlacesDebout fail";
	
    } 

    void testDemander(){
	FauxPassager[] faux = new FauxPassager[8];
	Passager[] fauxPassager = {new FauxPassager(),
				   new FauxPassager(), 
				   new FauxPassager(), 
				   new FauxPassager(), 
				   new FauxPassager(), 
				   new FauxPassager(), 
				   new FauxPassager(), 
				   new FauxPassager()}; // 8 passagers

	for(int i=0; i< 8; i++)
	    faux[i] = (FauxPassager) fauxPassager[i];
	
	Bus bus = new Autobus(5,3);
	/***** Remplissage des places assises *****/
	for(int i=0; i <= 4; i++){
	    
	    bus.demanderPlaceAssise(faux[i]);
	    //test Etat
	    if (i == 4)
		assert false == bus.aPlaceAssise() : "Fail Assis";
	    else
		assert true  == bus.aPlaceAssise() : "Fail demande Assis";
	    

	}
	//test Interaction avec le faussaire
	for(int i =0; i <= 4; i++){
	    assert 1 == faux[i].messages.size() : "interaction fail" + i;
	    assert "accepterPlaceAssise" == faux[i].messages.getLast() : "interaction fail" + i;
	}
	
	/***** Remplissage des places debout *****/
	for(int i=5; i<= 7; i++){
	    bus.demanderPlaceDebout(faux[i]);
	    
	    //test Etat
	    if (i == 7)
		assert false == bus.aPlaceDebout() : "Fail Debout";
	    else
		assert true  == bus.aPlaceDebout() : "Fail demande Debout";
	}
	
	//test Interaction avec le faussaire
	for(int i =5; i <= 7; i++){
	    assert 1 == faux[i].messages.size() : "interaction fail" + i;
	    assert "accepterPlaceDebout" == faux[i].messages.getLast() : "interaction fail" + i;
	}
    }

    

    void testDemanderSortie(){
	FauxPassager[] faux = new FauxPassager[6];
	Passager[] fauxPassager = {new FauxPassager(),
				   new FauxPassager(), 
				   new FauxPassager(), 
				   new FauxPassager(), 
				   new FauxPassager(), 
				   new FauxPassager(), 
			   }; // 6 passagers

	for(int i=0; i< 6; i++)
	    faux[i] = (FauxPassager) fauxPassager[i];

	Bus bus = new Autobus(3,3);
	for(int i=0; i<= 2; i++)
	    bus.demanderPlaceAssise(faux[i]);
	for(int i=3; i<= 5; i++)
	    bus.demanderPlaceDebout(faux[i]);
	
	assert false == bus.aPlaceAssise() : "Remplissage Places Assises";
	assert false == bus.aPlaceDebout() : "Remplissage Places Debout";
	
	faux[0].messages.clear();
	faux[3].messages.clear();  //on reinitialise les messages de trace pour tester uniquement la partie demanderSortie
	
	
	bus.demanderSortie(faux[0]);
	bus.demanderSortie(faux[3]);  //la gestion des erreurs de stockage des passagers n est pas prise en compte

	//Test Etat
	assert true == bus.aPlaceAssise() : "Test Etat DemanderSortie fail";
	assert true == bus.aPlaceDebout() : "Test Etat DemanderSortie fail";
	
	//Test Interaction
	
	assert faux[0].messages.size() == 2 : "Test Interaction fail";
	assert faux[3].messages.size() == 3 : "Test Interaction fail";
	
	assert faux[0].messages.get(1) == "estAssis" : "Test Interaction fail";
	assert faux[0].messages.get(2) == "accepterSortie" : "Test Interaction fail";
	
	assert faux[3].messages.get(1) == "estAssis" : "Test Interaction fail";
	assert faux[3].messages.get(2) == "estDebout" : "Test Interaction fail";
	assert faux[3].messages.getLast() == "accepterSortie" : "Test Interaction fail";
	    

    }

    void testAllerArretSuivant(){
	FauxPassager[] faux = new FauxPassager[5];
	Passager[] fauxPassager = {new FauxPassager(),
	
				   new FauxPassager(), 
				   new FauxPassager(), 
				   new FauxPassager(), 
				   new FauxPassager()
			   }; // 5 passagers
	for(int i=0; i< 5; i++)
	    faux[i] = (FauxPassager) fauxPassager[i];

	Bus bus = new Autobus(3,2);
	for(int i=0; i<=2; i++)
	    bus.demanderPlaceAssise(faux[i]);
	
	for(int i=3; i<=4; i++)
	    bus.demanderPlaceDebout(faux[i]);
	
	for(int i=0; i<=4; i++)
	    faux[i].messages.clear();
	
	bus.allerArretSuivant();
	
	for(int i=0; i<=4; i++){
	    assert 1 == faux[i].messages.size() : "Test AllerArretSuivant fail " + i ;
	    assert "nouvelArret" == faux[i].messages.getLast() : "Test AllerSuivant " + i;
	}
	
	bus.demanderSortie(faux[0]);
	bus.demanderSortie(faux[3]);
	
	faux[0].messages.clear();
	faux[3].messages.clear();

	bus.allerArretSuivant();
	assert 0 == faux[0].messages.size() : "Test AllerArretSuivant";
	assert 0 == faux[3].messages.size() : "Test AllerArretSuivant";
	
    }

    

    void testChanger(){
	FauxPassager[] faux = new FauxPassager[5];
	Passager[] fauxPassager = {new FauxPassager(),
	
				   new FauxPassager(), 
				   new FauxPassager(), 
				   new FauxPassager(), 
				   new FauxPassager(), 
	                           }; // 8 passagers
	for(int i=0; i< 5; i++)
	    faux[i] = (FauxPassager) fauxPassager[i];

	Bus bus = new Autobus(3,2);
	for(int i = 0; i <= 2; i++)
	    bus.demanderPlaceAssise(faux[i]);

	bus.demanderPlaceDebout(faux[3]);
	
	faux[2].messages.clear();
	bus.demanderChangerEnDebout(faux[2]);
	//Test Etat
	assert bus.aPlaceAssise() == true : "Test ChangerDebout fail";
	//Test d interaction
	assert 1 == faux[2].messages.size() : "Test interaction ChangerDebout fail";
	assert "accepterPlaceDebout" == faux[2].messages.getLast() : "Test interaction ChangerDebout fail";
	
	faux[3].messages.clear(); 
	bus.demanderChangerEnAssis(faux[3]);
	//Test Etat
	assert bus.aPlaceAssise() == false : "Test ChangerAssis fail";
	//Test d interaction
	assert 1 == faux[3].messages.size() : "Test interaction ChangerAssis fail";
	assert "accepterPlaceAssise" == faux[3].messages.getLast() : "Test interaction ChangerAssis fail";
	
	
    }








    void lancerTestAutobus() { 
    int nbTest = 0;

    testPlacesAssises(); 
    System.out.println("Test Place Assise Valid"); nbTest++; 
    
    testPlacesDebout();
    System.out.println("Test Place Debout Valid"); nbTest++; 

    testDemander();
    System.out.println("Test Demander Valid"); nbTest++; 

    testDemanderSortie();
    System.out.println("Test Demander Sortie Valid"); nbTest++; 

    testChanger();
    System.out.println("Test Changer Etat Valid"); nbTest++; 

    testAllerArretSuivant();
    System.out.println("Test AllerArretSuivant Valid"); nbTest++; 
    

    System.out.println("(" + nbTest + "):OK: " + getClass().getName()); 
  }
}
